﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace mrp16062010.Arayuz
{
    public partial class AnaEkran : Form
    {
        public AnaEkran()
        {
            InitializeComponent();
            OrnekVeri orn = new OrnekVeri();

        }

        private void Doldur()
        {
            Uretec.AgacCesidi.Duz duz = new Uretec.AgacCesidi.Duz();
            Uretec.AgacCesidi.Uzun uzun = new Uretec.AgacCesidi.Uzun();
            Uretec.AgacCesidi.Karisim karisim = new Uretec.AgacCesidi.Karisim();

            cmbAgacTipi.Items.Add(new ComboBoxItem("Düz", duz));
            cmbAgacTipi.Items.Add(new ComboBoxItem("Uzun", uzun));
            cmbAgacTipi.Items.Add(new ComboBoxItem("Karışık", karisim));


            Uretec.Aralik sipAralik1 = new Uretec.Aralik(1, 10);
            Uretec.Aralik sipAralik2 = new Uretec.Aralik(11, 50);
            Uretec.Aralik sipAralik3 = new Uretec.Aralik(51, 100);

            

            Uretec.Aralik teslimAralik1 = new Uretec.Aralik(1, 10);
            Uretec.Aralik teslimAralik2 = new Uretec.Aralik(11, 50);
            Uretec.Aralik teslimAralik3 = new Uretec.Aralik(51, 100);

            

            cmbSiralama.Items.AddRange(System.Enum.GetNames(typeof(Simulation.Kuyruk.IslemTipi)));

            cmbIsEmriAraligi.Items.Add(new ComboBoxItem("Günlük", 1));
            cmbIsEmriAraligi.Items.Add(new ComboBoxItem("Haftalık", 7));


            cmbKSabiti.SelectedIndex = 5;
        }

        private void AyarDoldur()
        {
            Ayarlar ayar = Ayarlar.Nesne;
            saatBaslangicMax.Value = ayar.CalismaSaatleri.Min.Saat;
            saatBaslangicMin.Value = ayar.CalismaSaatleri.Min.Dakika;
            saatBitisMax.Value = ayar.CalismaSaatleri.Max.Saat;
            saatBitisMin.Value = ayar.CalismaSaatleri.Max.Dakika;

            dateBaslangic.Value = ayar.AnaAralik.BaslangicTarihi;
            dateBitis.Value = ayar.AnaAralik.BitisTarihi;

            numSipBuyMax.Value = ayar.SiparisBuyuklugu.Max;
            numSipBuyMin.Value = ayar.SiparisBuyuklugu.Min;

            numGunlukSipAralikMax.Value = ayar.GunlukSiparisAraligi.Max;
            numGunlukSipAralikMin.Value = ayar.GunlukSiparisAraligi.Min;

            numTeslimAraligiMax.Value = ayar.TeslimAraligi.Max;
            numTeslimAraligiMin.Value = ayar.TeslimAraligi.Min;

            this.numBilesenKulAdediImalatMin.Value = ayar.UrunAgaciTipi.BilesenKullanimAdediImalat.Min;
            this.numBilesenKulAdediImalatMax.Value = ayar.UrunAgaciTipi.BilesenKullanimAdediImalat.Max;

            this.numBilesenKulAdediMontajMin.Value = ayar.UrunAgaciTipi.BilesenKullanimAdediMontaj.Min;
            this.numBilesenKulAdediMontajMax.Value = ayar.UrunAgaciTipi.BilesenKullanimAdediMontaj.Max;

            this.numImalatOpSureMin.Value = ayar.UrunAgaciTipi.ImalatOperasyonSuresi.Min;
            this.numImalatOpSureMax.Value = ayar.UrunAgaciTipi.ImalatOperasyonSuresi.Max;

            this.numMontajOpSureMin.Value = ayar.UrunAgaciTipi.MontajOperasyonSuresi.Min;
            this.numMontajOpSureMax.Value = ayar.UrunAgaciTipi.MontajOperasyonSuresi.Max;

            this.numImalatOpSayMin.Value = ayar.UrunAgaciTipi.ImalatOperasyonSayisi.Min;
            this.numImalatOpSayMax.Value = ayar.UrunAgaciTipi.ImalatOperasyonSayisi.Max;

            this.numMontajOpSayMin.Value = ayar.UrunAgaciTipi.MontajOperasyonSayisi.Min;
            this.numMontajOpSayMax.Value = ayar.UrunAgaciTipi.MontajOperasyonSayisi.Max;


            chkLogKaydet.Checked = ayar.LogKaydiAcik;

            chkVeriKaydet.Checked = ayar.VeriKaydiAcik;

            numSimCalAraligi.Value = Convert.ToInt32(ayar.SimilasyonCalismaAraligi.TotalMinutes);
        }

        private void AnaEkran_Load(object sender, EventArgs e)
        {
            
            Doldur();
            AyarDoldur();
            cmbAgacTipi.SelectedIndex = 0;
            cmbIsEmriAraligi.SelectedIndex = 0;
            cmbSiralama.SelectedIndex = 0;

        }

        List<Calistir> Calisanlar = new List<Calistir>();

        private void btnHesapla_Click(object sender, EventArgs e)
        {
             List<Uretec.VeriUret> datas = Uretec.VeriUret.Oku();
            int say = 0;

                DateTime baslangicTarihi = Ayarlar.Nesne.AnaAralik.BaslangicTarihi;

                DateTime bitisTarihi = Ayarlar.Nesne.AnaAralik.BitisTarihi;

                Tarih anaAralik = Ayarlar.Nesne.AnaAralik;
                List<Uretec.AralikSaat> TatilAraliklari = new List<Uretec.AralikSaat>();
                //TatilAraliklari.Add(new Uretec.AralikSaat(new Uretec.SaatTanim(12, 0), new Uretec.SaatTanim(13, 30)));
                Uretec.AralikSaat calismaSaatleri = new Uretec.AralikSaat(
                         new Uretec.SaatTanim
                             (9, 30),
                         new Uretec.SaatTanim
                             (17, 30)
                         );
                Uretec.Aralik SiparisBuyukluguAraligi = Ayarlar.Nesne.SiparisBuyuklugu;
                Uretec.Aralik GunlukSiparisAraligi = Ayarlar.Nesne.GunlukSiparisAraligi;
                Uretec.Aralik TeslimAraligi = Ayarlar.Nesne.TeslimAraligi;
                Cizelge cizelge = new Cizelge();
            Tarih tatilTarihleri = new Tarih();
            tatilTarihleri.BaslangicTarihi = anaAralik.BaslangicTarihi;
            tatilTarihleri.BitisTarihi = new DateTime(2013, 12, 30);
            Uretec.TatilUret tatilUret = new Uretec.TatilUret(TatilAraliklari, calismaSaatleri, tatilTarihleri);
            List<IsParcasi> TatilList = tatilUret.Olustur();
            cizelge.TatilEkle(TatilList);

            Yukle y = new Yukle(cizelge, datas.First().siparisListKarisim.First());
            Data.simulasyonEntities db = new Data.simulasyonEntities();
            foreach (IsParcasi item in y.SiparisBilgi.IsParcalari)
            {
                Data.IsParcasi parca = new Data.IsParcasi();
                parca.CalismaId = 0;
                parca.CizelgeBaslangic = item.BasTarihi;
                parca.CizelgeBitis = item.BitTarihi;
                parca.MakineNo = item.IM.Kod;
                parca.Uzunluk = Convert.ToInt32(item.Uzunluk.TotalMinutes);
                db.AddToIsParcasi(parca);
            }
            db.SaveChanges();
        }

       
        int say = 0;

        private void button1_Click(object sender, EventArgs e)
        {
            Rota.Karmala kar = new Rota.Karmala(OrnekVeri.OrnekRota);
            /*
            Raven db = new Raven();
            db.Sorgu();
            foreach (Calistir item in Calisanlar)
            {
                Console.Out.WriteLine(item.OrtamSimilasyon.SonTarih);
            }*/
            /*Cizelge c = Calisanlar.First().cizelge;
            CizelgeCizim.cizelgecizim cizim = new CizelgeCizim.cizelgecizim(c, true);
            cizim.Show();
            CizelgeCizim.cizelgecizim cizim2 = new CizelgeCizim.cizelgecizim(c, false);
            cizim2.Show();
            LogForm log = new LogForm();
            log.Show();*/
        }

        private void button2_Click(object sender, EventArgs e)
        {
            List<Uretec.VeriUret> datas = Uretec.VeriUret.Oku();
            Uretec.VeriUret veri = (from x in datas.Skip(0)
                                    select x).First();
            List<Rota.RotaParcasi> rota = new List<Rota.RotaParcasi>();
            rota.Add(veri.siparisListKarisim.First().Rota);
            AgacGoster goster = new AgacGoster(rota);
            goster.ShowDialog();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Uretec.VeriUret uret = new Uretec.VeriUret();
            List<Uretec.VeriUret> veriler = uret.VeriListeUret();
            Serialize.FileSerialization.FileSerialize(veriler, Ayarlar.Nesne.KayitYolu);
            MessageBox.Show("Yeni veri seti olustu");
            //List<Uretec.VeriUret> veriler2 = Serialize.FileSerialization.FileDeSerialize<List<Uretec.VeriUret>>(Ayarlar.Nesne.KayitYolu);
        }
        Uretec.UrunAgaciTipi secilenUrunAgaci;
        Uretec.Aralik secilenSiparisAraligi;
        Uretec.Aralik secilenTeslimAraligi;
        bool kKullan = true;
        int secilenIsEmriAraligi;
        TimeSpan isEmriAraligi;
        int calisanId = 0;
        int secilenKSabiti;
        private void button4_Click(object sender, EventArgs e)
        {

            secilenUrunAgaci = (Uretec.UrunAgaciTipi)((ComboBoxItem)cmbAgacTipi.SelectedItem).Value;
            
            secilenIsEmriAraligi = (int)((ComboBoxItem)cmbIsEmriAraligi.SelectedItem).Value;
            isEmriAraligi = TimeSpan.FromDays((double)secilenIsEmriAraligi);
            secilenKSabiti = Convert.ToInt32(cmbKSabiti.SelectedIndex);
            kKullan = chkKSab.Checked;
            Ayarlar.Nesne.SadeceIleriYukle = chkIleriYukle.Checked;
            Ayarlar.Nesne.Karmala = chkKarmala.Checked;

            Ayarlar.Nesne.UrunAgaci = secilenUrunAgaci;
            Ayarlar.Nesne.IsEmriAraligi = isEmriAraligi;
            foreach (int indexChecked in checkedListBox1.CheckedIndices)
            {
                secilenCalismalar.Add(indexChecked);
            }

            topluCalismaSiralama(secilenCalismalar.First());
            secilenCalismalar.Remove(secilenCalismalar.First());
        }

        List<int> secilenCalismalar = new List<int>();

        public void topluCalismaSiralama(int calismaId)
        {
            //cmbCalNo.SelectedIndex = calismaId;
            for (int siralama = 0; siralama < 6; siralama++)
                //for (int siralama = 0; siralama < 1; siralama++)
            {
                List<Uretec.VeriUret> datas = Uretec.VeriUret.Oku();
                int calismaNo = calismaId;

                Simulation.Kuyruk.IslemTipi secilenKuyrukTipi = (Simulation.Kuyruk.IslemTipi)siralama;
                Ayarlar.Nesne.KuyrukTipi = secilenKuyrukTipi;
                Uretec.VeriUret veri = (from x in datas.Skip(calismaNo)
                                        select x).First();
                List<Rota.RotaParcasi> secilenParcalar = null;
                List<Siparis> secilenSiparisler = null;
                if (secilenUrunAgaci.Id == 0)
                {
                    secilenParcalar = veri.parcaListDuz;
                    secilenSiparisler = veri.siparisListDuz;
                }
                else if (secilenUrunAgaci.Id == 1)
                {
                    secilenParcalar = veri.parcaListUzun;
                    secilenSiparisler = veri.siparisListUzun;
                }
                else if (secilenUrunAgaci.Id == 2)
                {
                    secilenParcalar = veri.parcaListKarisim;
                    secilenSiparisler = veri.siparisListKarisim;
                }

                //AgacGoster goster = new AgacGoster(secilenParcalar.First());
                //goster.ShowDialog();


                DateTime baslangicTarihi = Ayarlar.Nesne.AnaAralik.BaslangicTarihi;

                DateTime bitisTarihi = Ayarlar.Nesne.AnaAralik.BitisTarihi;

                Tarih anaAralik = Ayarlar.Nesne.AnaAralik;
                List<Uretec.AralikSaat> TatilAraliklari = new List<Uretec.AralikSaat>();
                //TatilAraliklari.Add(new Uretec.AralikSaat(new Uretec.SaatTanim(12, 0), new Uretec.SaatTanim(13, 30)));
                Uretec.AralikSaat calismaSaatleri = new Uretec.AralikSaat(
                         new Uretec.SaatTanim
                             (9, 30),
                         new Uretec.SaatTanim
                             (17, 30)
                         );
                Uretec.Aralik SiparisBuyukluguAraligi = Ayarlar.Nesne.SiparisBuyuklugu;
                Uretec.Aralik GunlukSiparisAraligi = Ayarlar.Nesne.GunlukSiparisAraligi;
                Uretec.Aralik TeslimAraligi = Ayarlar.Nesne.TeslimAraligi;
                

                Calistir calis = new Calistir(secilenParcalar,
                                                secilenSiparisler,
                                                secilenUrunAgaci,
                                                SiparisBuyukluguAraligi,
                                                TeslimAraligi,
                                                GunlukSiparisAraligi,
                                                secilenKuyrukTipi,
                                                isEmriAraligi,
                                                anaAralik,
                                                calismaSaatleri,
                                                TatilAraliklari,
                                                calismaNo,
                                                secilenKSabiti,
                                                kKullan);
                calis.Bitti += new Calistir.BittiHandler(calis_Bitti);

                Thread islem = new Thread(new ThreadStart(calis.Baslat));
                islem.Start();

                //calis.Baslat();
                Calisanlar.Add(calis);
            }
        }

        void calis_Bitti(object o, EventArgs e)
        {
            Calisanlar.Remove((Calistir)o);
            if (Calisanlar.Count == 0)
            {

                if (secilenCalismalar.Count == 0)
                {
                    MessageBox.Show("Hepsi Bitti");
                }
                else
                {
                    topluCalismaSiralama(secilenCalismalar.First());
                    secilenCalismalar.Remove(secilenCalismalar.First());
                }

            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            Uretec.UrunAgaciTipi secilenUrunAgaci = (Uretec.UrunAgaciTipi)((ComboBoxItem)cmbAgacTipi.SelectedItem).Value;
            Simulation.Kuyruk.IslemTipi secilenKuyrukTipi = (Simulation.Kuyruk.IslemTipi)System.Enum.Parse(typeof(Simulation.Kuyruk.IslemTipi), cmbSiralama.SelectedItem.ToString());
            int secilenIsEmriAraligi = (int)((ComboBoxItem)cmbIsEmriAraligi.SelectedItem).Value;
            TimeSpan isEmriAraligi = TimeSpan.FromDays((double)secilenIsEmriAraligi);


            Ayarlar.Nesne.UrunAgaci = secilenUrunAgaci;
            Ayarlar.Nesne.IsEmriAraligi = isEmriAraligi;
            Ayarlar.Nesne.KuyrukTipi = secilenKuyrukTipi;
            int calismaNo = 0;
            List<Uretec.VeriUret> datas = Uretec.VeriUret.Oku();
            Uretec.VeriUret veri = (from x in datas.Skip(calismaNo)
                                    select x).First();
            List<Rota.RotaParcasi> secilenParcalar;
            List<Siparis> secilenSiparisler;
            if (secilenUrunAgaci.Id == 0)
            {
                secilenParcalar = veri.parcaListDuz;
                secilenSiparisler = veri.siparisListDuz;
            }
            else if (secilenUrunAgaci.Id == 1)
            {
                secilenParcalar = veri.parcaListUzun;
                secilenSiparisler = veri.siparisListUzun;
            }
            else if (secilenUrunAgaci.Id == 2)
            {
                secilenParcalar = veri.parcaListKarisim;
                secilenSiparisler = veri.siparisListKarisim;
            }


            DateTime baslangicTarihi = Ayarlar.Nesne.AnaAralik.BaslangicTarihi;

            DateTime bitisTarihi = Ayarlar.Nesne.AnaAralik.BitisTarihi;

            Tarih anaAralik = Ayarlar.Nesne.AnaAralik;
            List<Uretec.AralikSaat> TatilAraliklari = new List<Uretec.AralikSaat>();
            //TatilAraliklari.Add(new Uretec.AralikSaat(new Uretec.SaatTanim(12, 0), new Uretec.SaatTanim(13, 30)));
            Uretec.AralikSaat calismaSaatleri = new Uretec.AralikSaat(
                     new Uretec.SaatTanim
                         (9, 30),
                     new Uretec.SaatTanim
                         (17, 30)
                     );
            Uretec.Aralik SiparisBuyukluguAraligi = Ayarlar.Nesne.SiparisBuyuklugu;
            Uretec.Aralik GunlukSiparisAraligi = Ayarlar.Nesne.GunlukSiparisAraligi;
            Uretec.Aralik TeslimAraligi = Ayarlar.Nesne.TeslimAraligi;
            Tarih tar2 = new Tarih(new DateTime(2010, 01, 1, 10, 0, 0), new DateTime(2010, 01, 1, 15, 0, 0));
            secilenSiparisler = new List<Siparis>();

            secilenSiparisler.Add(veri.siparisListUzun.First());
            secilenSiparisler.First().TarihBilgisi = tar2;

            secilenParcalar = new List<Rota.RotaParcasi>();
            secilenParcalar.Add(secilenSiparisler.First().Rota);


            //Siparis sip2 = new Siparis(10, OrnekVeri.OrnekRota, 10, tar2);
            //secilenSiparisler.Add(sip2);


            Calistir calis = new Calistir(secilenParcalar,
                                            secilenSiparisler,
                                            secilenUrunAgaci,
                                            SiparisBuyukluguAraligi,
                                            TeslimAraligi,
                                            GunlukSiparisAraligi,
                                            secilenKuyrukTipi,
                                            isEmriAraligi,
                                            anaAralik,
                                            calismaSaatleri,
                                            TatilAraliklari,
                                            calismaNo,
                                            secilenKSabiti,
                                            kKullan);

            calis.Baslat();
        }

        private void btnYukHesapla_Click(object sender, EventArgs e)
        {
            StreamWriter SW;
            SW = File.CreateText("c:\\YUK.txt");

            List<Uretec.VeriUret> datas = Uretec.VeriUret.Oku();

            Uretec.VeriUret veri = datas.First();
            YukHesapla yukUzun = new YukHesapla(veri.siparisListKarisim);
            int aysay = 0;
            foreach (List<double> item in yukUzun.sureler)
            {
                aysay++;
                int say = 0;
                SW.WriteLine(aysay.ToString() + ". AY:");
                double aylikTop = 0;
                foreach (double deger in item)
                {
                    say++;
                    SW.WriteLine(deger.ToString());
                    aylikTop += deger;
                }
                SW.WriteLine("Ortalama:" + (aylikTop / 18.00).ToString());
            }

            SW.Close();
            MessageBox.Show("Hesaplandı: c de yuk.txt içinde");
            //YukHesapla yuk = new YukHesapla(
        }

        private void button6_Click(object sender, EventArgs e)
        {
            string bilgi = "";
            foreach (Calistir item in Calisanlar)
            {
                bilgi += "-" + item.CalismaId.ToString();
            }
            this.Text = bilgi;
            MessageBox.Show(bilgi);
        }

        private void button7_Click(object sender, EventArgs e)
        {
            Form1 f = new Form1();

            f.Show();
        }

        private void AyarOku()
        {
            Ayarlar ayar = Ayarlar.Nesne;
            ayar.CalismaSaatleri.Min.Saat = Convert.ToInt32(this.saatBaslangicMax.Value);
            ayar.CalismaSaatleri.Min.Dakika = Convert.ToInt32(this.saatBaslangicMin.Value);
            ayar.CalismaSaatleri.Max.Saat = Convert.ToInt32(this.saatBitisMax.Value);
            ayar.CalismaSaatleri.Max.Dakika = Convert.ToInt32(this.saatBitisMin.Value);

            ayar.AnaAralik.BaslangicTarihi = this.dateBaslangic.Value;
            ayar.AnaAralik.BitisTarihi = this.dateBitis.Value;

            ayar.GunlukSiparisAraligi.Min = Convert.ToInt32(this.numGunlukSipAralikMin.Value);
            ayar.GunlukSiparisAraligi.Max = Convert.ToInt32(this.numGunlukSipAralikMax.Value);

            ayar.SiparisBuyuklugu.Min = Convert.ToInt32(this.numSipBuyMin.Value);
            ayar.SiparisBuyuklugu.Max = Convert.ToInt32(this.numSipBuyMax.Value);

            ayar.TeslimAraligi.Min = Convert.ToInt32(this.numTeslimAraligiMin.Value);
            ayar.TeslimAraligi.Max = Convert.ToInt32(this.numTeslimAraligiMax.Value);

            ayar.UrunAgaciTipi.BilesenKullanimAdediImalat.Min = Convert.ToInt32(this.numBilesenKulAdediImalatMin.Value);
            ayar.UrunAgaciTipi.BilesenKullanimAdediImalat.Max = Convert.ToInt32(this.numBilesenKulAdediImalatMax.Value);

            ayar.UrunAgaciTipi.BilesenKullanimAdediMontaj.Min = Convert.ToInt32(this.numBilesenKulAdediMontajMin.Value);
            ayar.UrunAgaciTipi.BilesenKullanimAdediMontaj.Max = Convert.ToInt32(this.numBilesenKulAdediMontajMax.Value);

            ayar.UrunAgaciTipi.ImalatOperasyonSuresi.Min = Convert.ToInt32(this.numImalatOpSureMin.Value);
            ayar.UrunAgaciTipi.ImalatOperasyonSuresi.Max = Convert.ToInt32(this.numImalatOpSureMax.Value);

            ayar.UrunAgaciTipi.MontajOperasyonSuresi.Min = Convert.ToInt32(this.numMontajOpSureMin.Value);
            ayar.UrunAgaciTipi.MontajOperasyonSuresi.Max = Convert.ToInt32(this.numMontajOpSureMax.Value);

            ayar.UrunAgaciTipi.ImalatOperasyonSayisi.Min = Convert.ToInt32(this.numImalatOpSayMin.Value);
            ayar.UrunAgaciTipi.ImalatOperasyonSayisi.Max = Convert.ToInt32(this.numImalatOpSayMax.Value);

            ayar.UrunAgaciTipi.MontajOperasyonSayisi.Min = Convert.ToInt32(this.numMontajOpSayMin.Value);
            ayar.UrunAgaciTipi.MontajOperasyonSayisi.Max = Convert.ToInt32(this.numMontajOpSayMax.Value);

            ayar.VeriKaydiAcik = chkVeriKaydet.Checked;

            ayar.LogKaydiAcik = chkLogKaydet.Checked;

            ayar.SimilasyonCalismaAraligi = new TimeSpan(0, Convert.ToInt32(numSimCalAraligi.Value), 0);
        }

        private void button8_Click(object sender, EventArgs e)
        {
            AyarOku();
            Ayarlar.Nesne.Kaydet();
            MessageBox.Show("Ayarlar kaydedildi");
        }

        private void btnDuzAyar_Click(object sender, EventArgs e)
        {
            AgacAyar ayar = new AgacAyar("Duz");
            ayar.Show();
        }

        private void btnUzunAyar_Click(object sender, EventArgs e)
        {
            AgacAyar ayar = new AgacAyar("Uzun");
            ayar.Show();
        }

        private void btnKarisimAyar_Click(object sender, EventArgs e)
        {
            AgacAyar ayar = new AgacAyar("Karisim");
            ayar.Show();
        }

        private void button9_Click(object sender, EventArgs e)
        {
            List<Uretec.VeriUret> datas = Uretec.VeriUret.Oku();
            foreach (Uretec.VeriUret item in datas)
            {
                item.Duzelt();
            }
            Serialize.FileSerialization.FileSerialize(datas, Ayarlar.Nesne.KayitYolu);
            MessageBox.Show("Yeni veri seti olustu");
        }


    }
}
